package 类初始化和实例初始化;

/**
 * @author zsh
 * @company wlgzs
 * @create 2019-03-26 16:28
 * @Describe
 * 子类的类初始化<clinit>()方法：
 * （1）j = method()
 * （2）子类的静态代码块
 *
 * 先初始化父类：（5）（1）
 * 再初始化子类：（10）（6）
 *
 * 子类的实例初始化方法：
 * （1）super()（最前）（9）（3）（2）
 * （2）i = test() （9）
 * （3）子类的非静态代码块 （8）
 * （4）子类的无参构造器（最后） （7）
 *
 * 因为创建了两个Son对象，因此实例化方法<init>()执行两次
 * （9）（3）（2）（9）（8）（7）
 */
public class Son extends Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.print("(6)");
    }
    Son(){
        //子类构造器一定会调用父类的构造器
        //super();
        System.out.print("(7)");
    }
    {
        System.out.print("(8)");
    }

    public int test() {
        System.out.print("(9)");
        return 1;
    }

    public static int method() {
        System.out.print("(10)");
        return 0;
    }

    public static void main(String[] args) {
        Son s1 = new Son();
        System.out.println();
        Son s2 = new Son();
    }
}
